Linux 初始化 arm

您所在的位置:网站首页 linux mmu初始化 Linux 初始化 arm

Linux 初始化 arm

2023-09-12 17:07| 来源: 网络整理| 查看: 265

* Kernel startup entry point.  * ---------------------------  *  * The requirements are:  *   MMU = off, D-cache = off, I-cache = on or off,  *   x0 = physical address to the FDT blob.  *  * This code is mostly position independent so you call this at  * __pa(PAGE_OFFSET + TEXT_OFFSET).  *  * Note that the callee-saved registers are used for storing variables  * that are useful before the MMU is enabled. The allocations are described  * in the entry routines.

__HEAD _head: b    stext                // branch to kernel start, magic le64sym    _kernel_offset_le        // Image load offset from start of RAM, little-endian le64sym    _kernel_size_le            // Effective size of kernel image, little-endian le64sym    _kernel_flags_le        // Informative flags, little-endian DEFINE_IMAGE_LE64(_kernel_size_le, _end - _text);    \ DEFINE_IMAGE_LE64(_kernel_offset_le, TEXT_OFFSET);    \ DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS);

__INIT stext   ================= head.s     preserve_boot_args     el2_setup     set_cpu_boot_mode_flag     __create_page_tables     __cpu_setup     __primary_switch         __primary_switched             adr_l    x8, vectors            // load VBAR_EL1 with virtual                          msr    vbar_el1, x8            // vector table address                          Bits [63:11]              Vector Base Address. Base address of the exception vectors for exceptions taken in EL1.               const struct cpu_operations acpi_parking_protocol_ops = {     .name        = "parking-protocol",     .cpu_init    = acpi_parking_protocol_cpu_init,     .cpu_prepare    = acpi_parking_protocol_cpu_prepare,     .cpu_boot    = acpi_parking_protocol_cpu_boot,     .cpu_postboot    = acpi_parking_protocol_cpu_postboot }; secondary_entry     el2_setup     set_cpu_boot_mode_flag     secondary_startup         __cpu_secondary_check52bitva         __cpu_setup         __enable_mmu         __secondary_switched:             adr_l    x5, vectors             msr    vbar_el1, x5                  

\()\el\() 变量,  \label 变量          可以对应:el0_sync /*  * Exception vectors.  */     .pushsection ".entry.text", "ax"

    .align    11          ENTRY(vectors)     kernel_ventry    1, sync_invalid            // Synchronous EL1t     kernel_ventry    1, irq_invalid            // IRQ EL1t     kernel_ventry    1, fiq_invalid            // FIQ EL1t     kernel_ventry    1, error_invalid        // Error EL1t     kernel_ventry    1, sync                // Synchronous EL1h     kernel_ventry    1, irq                // IRQ EL1h     kernel_ventry    1, fiq_invalid            // FIQ EL1h     kernel_ventry    1, error            // Error EL1h     kernel_ventry    0, sync                // Synchronous 64-bit EL0     kernel_ventry    0, irq                // IRQ 64-bit EL0     kernel_ventry    0, fiq_invalid            // FIQ 64-bit EL0     kernel_ventry    0, error            // Error 64-bit EL0     kernel_ventry    0, sync_invalid, 32        // Synchronous 32-bit EL0 #endif END(vectors)

由于用户态是在el0,因此当用户态指令发生异常时会陷入到kernel中的。 会执行 ventry el0_sync // Synchronous 64-bit EL0

el0_sync()/el0_irq() ->     el0_svc     sys_call_table      ret_to_user() -> work_pending() -> do_notify_resume()  



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3